package modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;

/**
 * La Clase Carro representa un carro en esta tienda virtual. un Carro
 * contiene los productos que el usuario comprara en la tienda.
 * Ademas es una entidad JPA que mapea un registro de la tabla carro desde la
 * BD.
 * @author Franco Camilo Gonzalez Chaparro.
 */
@Entity
@Table(name = "carro")
@PrimaryKeyJoinColumn(name = "ID_DETALLE")
public class Carro implements Serializable {
    /**
     * variable usada para guardar la version de la clase para la
     * serializacion.
     */
    private static final long serialVersionUID = 1L;
    /**
     * El atributo idCarro es el identificador unico de un carro.
     */
    @Id
    @Column(name = "ID_CARRO")
    @GeneratedValue
    private int idCarro;
    /**
     * El atributo nombreUsuario es el nombre del usuario que esta vinculado
     * al carro de compras.
     */
    @Column(name = "NOMBRE_USUARIO")
    private String nombreUsuario = "no";
    /**
     * El atributo compraFinalizada identifica si la compra esta en proceso(0)
     * o si ya fue realizada(1).
     */
    @Column(name = "COMPRA_FINALIZADA")
    private int compraFinalizada;
    /**
     * El atributo fechaCompra es la fecha en que se realizo la compra.
     */
    @Column(name = "FECHA_COMPRA")
    private Date fechaCompra;
    /**
     * El atributo detalleCarro es una lista de objetos de DetalleCarro y
     * contiene los detalles de los productos que se han agregado al carro.
     */
    @OneToMany(mappedBy = "idCarro", cascade = CascadeType.ALL)
    private List<DetalleCarro> detalleCarro = new ArrayList<DetalleCarro>();

    /**
     * Constructor por defecto de la Clase Carro.
     */
    public Carro() {
        super();
    }

    /**
     * Constructor de la Clase Carro.
     * @param nombreUsuario
     *            es el nombre del usuario que esta vinculado al carro de
     *            compras.
     * @param compraFinalizada
     *            identifica si la compra esta en proceso(0) o si ya fue
     *            realizada(1).
     * @param fechaCompra
     *            es la fecha en que se realizo la compra.
     * @param detalleCarro
     *            es una lista de objetos de DetalleCarro y contiene los
     *            detalles de los productos que se han agregado al carro.
     */
    public Carro(String nombreUsuario, int compraFinalizada, Date fechaCompra,
            List<DetalleCarro> detalleCarro) {
        super();
        this.nombreUsuario = nombreUsuario;
        this.compraFinalizada = compraFinalizada;
        this.fechaCompra = fechaCompra;
        this.detalleCarro = detalleCarro;
    }

    /**
     * Permite obtener el valor del atributo idCarro.
     * 
     * @return el valor de idCarro.
     */
    public int getIdCarro() {
        return idCarro;
    }

    /**
     * Permite establecer el valor del atributo idCarro.
     * 
     * @param idCarro
     *            contiene el nuevo valor para el atributo idCarro.
     */
    public void setIdCarro(int idCarro) {
        this.idCarro = idCarro;
    }

    /**
     * Permite obtener el valor del atributo nombreUsuario.
     * 
     * @return el valor de nombreUsuario.
     */
    public String getNombreUsuario() {
        return nombreUsuario;
    }

    /**
     * Permite establecer el valor del atributo nombreUsuario.
     * 
     * @param nombreUsuario
     *            contiene el nuevo valor para el atributo nombreUsuario.
     */
    public void setNombreUsuario(String nombreUsuario) {
        this.nombreUsuario = nombreUsuario;
    }

    /**
     * Permite obtener el valor del atributo compraFinalizada.
     * 
     * @return el valor de compraFinalizada.
     */
    public int getCompraFinalizada() {
        return compraFinalizada;
    }

    /**
     * Permite establecer el valor del atributo compraFinalizada.
     * 
     * @param compraFinalizada
     *            contiene el nuevo valor para el atributo compraFinalizada.
     */
    public void setCompraFinalizada(int compraFinalizada) {
        this.compraFinalizada = compraFinalizada;
    }

    /**
     * Permite obtener el valor del atributo fechaCompra.
     * 
     * @return el valor de fechaCompra.
     */
    public Date getFechaCompra() {
        return fechaCompra;
    }

    /**
     * Permite establecer el valor del atributo fechaCompra.
     * 
     * @param fechaCompra
     *            contiene el nuevo valor para el atributo fechaCompra.
     */
    public void setFechaCompra(Date fechaCompra) {
        this.fechaCompra = fechaCompra;
    }

    /**
     * Permite obtener el valor del atributo detalleCarro.
     * 
     * @return el valor de detalleCarro.
     */
    public List<DetalleCarro> getDetalleCarro() {
        return detalleCarro;
    }

    /**
     * Permite establecer el valor del atributo detalleCarro.
     * 
     * @param detalleCarro
     *            contiene el nuevo valor para el atributo detalleCarro.
     */
    public void setDetalleCarro(List<DetalleCarro> detalleCarro) {
        this.detalleCarro = detalleCarro;
    }

}
